home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
mxconbo
/
mxconbo.asm
< prev
next >
Wrap
Assembly Source File
|
1995-02-06
|
17KB
|
1,068 lines
; MXCON.ASM
; MXCON.COM Copyrights(c)1994 MIYAZAKI
; MXCONBO.COM Arranged 1995 by Boko.
.286
; 1995/01/16 Nifty:FOAU2初公開版
; つねにGVRAMを表示するよう修正
; カーソル情報をDOS内部のワークから取得、BIOS(INT90)のフックを廃止
; 全角文字上の全角カーソル
; charpal の背景拡大機能に対応
; 1995/02/06 フリコレ10 応募版
; カーソルのちらつき修正
; パレット設定ルーンチ変更
; 4プレーンすべて表示する
code segment
assume cs:code,ds:nothing,es:nothing,ss:nothing
org 02ch
envseg label word
org 080h
cmdline label byte
org 100h
entry: jmp main
gvram0 equ 0c000h
gvram equ 0c019h
cvram equ 0c800h
kvram equ 0ca00h
ankcg equ 0cb00h
io_work equ 00040h
; CRTCアドレス
CRTC_ADR_REG equ 00440h
; CRTCデータ
CRTC_DAT_REG equ 00442h
max_x equ 80
max_y equ 24
max_y2 equ 25
chrsiz equ 16
linsiz equ 16
irq_code equ 0bh
; 画面更新間隔の設定
vs_time equ 4
;*****************************
;* work vram eria
;****************************
; 常駐チェック用ID文字列
chk_str db 'MXCONBO'
vs_cnt db vs_time
vs_chk db 0
align 4
dmy_ram dw (max_x*max_y2) dup(0)
cursor_e_ad dw 0
cursor_a_ad dw 0
cursor_f_ad dw 0
cursor_s_ad dw 0
cursor_p_adr label dword
cursor_p_ad dw 0
dw io_work
cur_xy dw 0 ; low x , hi y
vs_para db 0,0
vs_off dw ?
vs_seg dw ?
old_off dw ?
old_seg dw ?
irq_map db 0,0,0,0
vdb_ent db 0
cur_attr db 02h ; size = 2
attr_flag db ?
even
int_ent proc far
mov dx,05cah
out dx,al
sti
dec cs:[vs_cnt]
jne int_rt
mov cs:[vs_cnt],vs_time
mov ax,cs
mov ds,ax
; 二重エントリーは禁止
cmp [vs_chk],0
jne int_rt
; TVRAM書き込みフラグチェック&クリア
mov dx,05c8h
in al,dx
test al,80h
jne int_go
; カーソル位置チェック
les bx,[cursor_p_adr]
mov ax,es:[bx]
cmp ax,[cur_xy]
je int_rt
int_go: mov [vs_chk],1 ;多重割り込み防止
call _cflush
mov cs:[vs_chk],0
int_rt: ret
int_ent endp
assume cs:code,ds:code,es:code,ss:nothing
;****************************************
; wrt_ank
; al:char ah:attr
; cx:x bx:y(VRAMアドレス)
;****************************************
align 4
_wrt_ank proc near
push ds
push si
push es
push di
push cx
push bx
mov dx,ax
sub dh,dh ; char=>ankcg address [si]
shl dx,4 ; * 16
mov si,dx
mov di,bx
add di,cx
mov bl,ah
mov cl,bl ;cl
and bx,7
; 高輝度?
; 94/01/05 ブリンク属性も
test cl,30h ;cl
je $i147
or bl,8 ;at
$i147:
; リバース?
test cl,08h
je $i148
dec bh ;bk bh=0ffh
$i148:
; フォントROMのセグメント
mov ax,ankcg
mov ds,ax
; VRAMのセグメントセット
mov ax,gvram
mov es,ax
; ANKCGを選択
mov dx,0ff99h
mov al,01h
out dx,al
; vramプレーン選択
; (4プレーンに書き込み)
mov dx,0ff81h
mov cx,80-1
; 色が同じなら消さない
cmp cs:[attr_flag],0
je same_attr_a
mov al,0fh
out dx,al
cmp al,bl
je $sclr
; 文字を消す
sub al,al
rept 16
stosb
add di,cx
endm
sub di,80*16
; vramプレーン
; IRGBの選択
same_attr_a:
mov al,bl
out dx,al
$sclr: or bh,bh
jne $ff100
; 文字書き込み
; (ノーマル)
lodsw
mov es:[di],al
mov es:[di+80* 1],ah
lodsw
mov es:[di+80* 2],al
mov es:[di+80* 3],ah
lodsw
mov es:[di+80* 4],al
mov es:[di+80* 5],ah
lodsw
mov es:[di+80* 6],al
mov es:[di+80* 7],ah
lodsw
mov es:[di+80* 8],al
mov es:[di+80* 9],ah
lodsw
mov es:[di+80*10],al
mov es:[di+80*11],ah
lodsw
mov es:[di+80*12],al
mov es:[di+80*13],ah
lodsw
mov es:[di+80*14],al
mov es:[di+80*15],ah
$ff101:
; Kvram選択
mov dx,0ff99h
xor al,al
out dx,al
pop bx
pop cx
pop di
pop es
pop si
pop ds
ret
align 4
; 文字書き込み
; (リバース)
$ff100:
rept 16
lodsb
xor al,bh
stosb
add di,cx
endm
jmp $ff101
_wrt_ank endp
;************************************
; wrt_kan
; dx:漢字(反転注意) ah:attr
; cx:x bx:y
;************************************
align 4
_wrt_kan proc near
push es
push di
push cx
push bx
mov di,bx
add di,cx ;di=vram_address
mov cl,ah
mov bx,cx
mov cx,dx
xchg ch,cl
;****** bug fix start *******
cmp ch,70h
jb cnv_end
cmp ch,74h
ja cnv_end
cmp cl,60h
jb cnv_end
cmp cl,7eh
ja cnv_end
add cx,07c0h
; jmp short cnv_end
; align 4
;Not_Cnv: cmp ch,75h
; je Ext_Cnv
; cmp ch,76h
; jne Cnv_End
;Ext_Cnv: sub ch,75h
; sub cl,21h
; mov al,94
; mul ch
; xor ch,ch
; add ax,cx
; mov dx,ax
; shr dx,5 ; dx / 32
; and ax,1Fh ; ax % 32
; mov ch,dl ; dx * 256
; mov cl,al
; add cx,0900h
cnv_end:
;******* bug fix end ********
xchg ch,cl
mov ax,cx
mov cx,bx
mov dx,0ff94h
out dx,al
inc dx
mov al,ah
out dx,al
mov bl,cl ;cl
and bx,7
test cl,30h ;cl
je $i247
or bl,8 ;at
$i247:
test cl,08h ;cl
je $i248
dec bh ;bk bh=0ffh
$i248: mov ax,gvram
mov es,ax
mov dx,0ff81h
mov cx,80-2
cmp cs:[attr_flag],0
je same_attr_k
mov al,0fh
out dx,al
cmp al,bl
je $sclr_k
sub ax,ax
$f251: rept 16
stosw
add di,cx
endm
sub di,80*16
same_attr_k:
mov al,bl
out dx,al
$sclr_k: mov dx,0ff96h
and bh,bh
jne $f277
$ff200:
insb
inc dx
insb
add di,cx
rept 15
dec dx
insb
inc dx
insb
add di,cx
endm
$ff201:
pop bx
pop cx
pop di
pop es
ret
align 4
$f277:
in al,dx
xor al,bh
stosb
inc dx
in al,dx
xor al,bh
stosb
add di,cx
rept 15
dec dx
in al,dx
xor al,bh
stosb
inc dx
in al,dx
xor al,bh
stosb
add di,cx
endm
jmp $ff201
_wrt_kan endp
;***********************************************
;仮想VRAM部(DMYCON Ver2.03)
; by (山)
;***********************************************
public _cflush
_cflush proc near
push ds
cld
; tvramの
; セグメント設定
mov ax,cvram ; cp
mov ds,ax
xor si,si
; ダミーram(比較先)
; セグメント設定
mov ax,cs ; dp
mov es,ax
mov di,offset dmy_ram
xor cx,cx ; x:cx
xor bx,bx ; y:bx
align 4
cf_lp1:
mov ax,[si]
sub ah,es:[di+1]
mov es:[attr_flag],ah
; tvram attrから
; 2 バイト取得
mov ax,[si]
; 漢字フラグ?
test ah,40h
je short cf_ank
; 漢字vramから
; 2 バイト取得
mov dx,[si+2000h]
; tvramとダミー
; vramとの比較
cmp dh,es:[di+0]
jne short cf_knj
cmp dl,es:[di+2]
jne short cf_knj
cmp ah,es:[di+1]
je short cf_ked
cf_knj:
; ダミーvramを更新して
; tvramの内容と
; 等しくする
mov es:[di+1],ah
mov es:[di+0],dh
mov es:[di+2],dl
mov byte ptr es:[di+3],0bfh
; 2バイト文字の表示
call _wrt_kan
cf_ked: add si,4
add di,4
add cx,2
jmp short cf_end
align 4
cf_ank:
; tvramとダミーvramとの比較
cmp ax,es:[di]
; ダミーvramの更新
stosw
je short cf_aed
call _wrt_ank
cf_aed: add si,2
inc cx
cf_end: cmp cx,max_x
jb short cf_lp1
sub cx,max_x
add bx,80*linsiz
cmp bx,max_y2*80*linsiz
jb short cf_lp1
pop ds
;*****************************
; locate
;*****************************
_locate proc near
mov al,0fh
mov dx,0fda0h
out dx,al
; カーソルアトリビュート
mov ax,io_work
mov es,ax
mov bx,[cursor_a_ad]
mov al,es:[bx]
and al,060h
cmp al,020h
je loca_ret
; カーソル表示/非表示
mov bx,[cursor_f_ad]
cmp byte ptr es:[bx],0
jne loca_ret
; カーソル行桁位置
inc BX
mov cx,es:[bx]
mov [cur_xy],cx
sub cx,00101h
mov bl,ch
xor ch,ch
mov ax,max_x
mul bl
add ax,cx
shl ax,1
add ax,offset dmy_ram
mov di,ax
; カーソルの幅(Byte/Word)設定
mov byte ptr [loca1+1],0f6h ; カーソル半角
test byte ptr [di+1],040h
je l_ank
mov byte ptr [loca1+1],0f7h ; カーソル全角
l_ank:
xor byte ptr [di+1],007h
shl bx,4 ; y *= 16
xor ah,ah
mov di,[cursor_e_ad]
mov al,byte ptr es:[di]
mov di,[cursor_s_ad]
sub al,byte ptr es:[di]
inc ax
mov [cur_attr],al
mov al,byte ptr es:[di]
add bx,ax
mov ax,80
mul bx ; y *= 80
add ax,cx ; y + x
mov di,ax
mov ax,gvram
mov es,ax
mov dx,0ff81h
mov al,00000001b
call loca_sub
mov al,01000010b
call loca_sub
mov al,10000100b
call loca_sub
mov al,11001000b
call loca_sub
loca_ret:
ret
loca_sub: out dx,al
push di
xor cx,cx
mov cl,[cur_attr]
loca1: not byte ptr es:[di] ; 実行時に書換えしてます。
add di,80
loop loca1
pop di
ret
_locate endp
_cflush endp
start_init label word
;********************************************************
; 割り込みの設定
;********************************************************
vs_set proc near
push ds
cli
; FM音源タイマB割り込み
; 標準DOSコンソール停止
mov dx,04d8h
vs_set_1: in al,dx
test al,80h
jnz vs_set_1
mov dx,04d8h
mov al,27h
out dx,al
; wait
jmp short $+2
jmp short $+2
mov dx,04d8h
vs_set_2: in al,dx
test al,80h
jnz vs_set_2
mov dx,04dah
mov al,00h
out dx,al
sti
; vsync割込アドレスの取り出し
mov ah,01h
mov dl,irq_code
int 0aeh
; 旧vsync割込アドレス保存
mov cs:[old_off],di
mov cs:[old_seg],ds
; vsync割込ルーチン登録
push cs
pop ds
mov di,offset int_ent
mov cs:[vs_off],di
mov cs:[vs_seg],ds
mov di,offset vs_para
mov ah,00h
mov dl,irq_code
int 0aeh
; 割込許可データ取り出し
mov ah,03h
mov di,offset irq_map
int 0aeh
; VSYNC割り込み許可
or byte ptr ds:[di+2],08h
mov ah,02h
int 0aeh
; VSYNC割り込み要因クリア
mov dx,05cah
out dx,al
pop ds
ret
vs_set endp
vs_reset proc near
push ds
push cs
pop ds
; 割込許可データ取り出し
mov ah,03h
mov di,offset irq_map
int 0aeh
; VSYNC割り込み禁止
and byte ptr cs:[di+2],0f7h
mov ah,02h
int 0aeh
; 旧vsync割込ルーチン復旧
mov di,es:[old_off]
mov ds,es:[old_seg]
mov ah,00h
mov dl,irq_code
int 0aeh
; FM音源タイマB割り込み
; 標準DOSコンソール再開
cli
mov dx,04d8h
vs_reset_1: in al,dx
test al,80h
jnz vs_reset_1
mov dx,04d8h
mov al,27h
out dx,al
; wait
jmp short $+2
jmp short $+2
mov dx,04d8h
vs_reset_2: in al,dx
test al,80h
jnz vs_reset_2
mov dx,04dah
mov al,2ah
out dx,al
sti
pop ds
ret
vs_reset endp
pal_tbl dw 00000h
dw 000b0h
dw 00b00h
dw 00bb0h
dw 0b000h
dw 0b0b0h
dw 0bb00h
dw 0bbb0h
dw 04440h
dw 000f0h
dw 00f00h
dw 00ff0h
dw 0f000h
dw 0f0f0h
dw 0ff00h
dw 0fff0h
palet_init proc near
; レイア0の16色
; パレット選択
mov dx,00448h
mov al,1
out dx,al
inc dx
inc dx
mov al,0
out dx,al
sub cl,cl
mov si,offset pal_tbl
pal_init_1: mov al,cl
mov dx,0fd90h
out dx,al
lodsw
call palet_init_sub
call palet_init_sub
call palet_init_sub
inc cl
cmp cl,16
jb pal_init_1
ret
palet_init_sub:
inc dx
inc dx
out dx,al
ror ax,4
ret
palet_init endp
trap_chk proc near
; 常駐チェックルーチン
push ds
push es
; vsync割込アドレスの取り出し
mov ah,01h
mov dl,irq_code
int 0aeh
mov cs:[vs_seg],ds
cld
mov cx,7
mov si,offset chk_str
mov di,offset chk_str
repe cmpsb
pop es
pop ds
ret
trap_chk endp
main proc near
cld
mov si,offset cmdline
lodsb
mov ah,al
main_cmd: cmp ah,0
je main_init
dec ah
lodsb
cmp al,'-'
jne main_cmd
call trap_chk
jne main_ret
; 常駐解除
call vs_reset
; メモリ開放
mov es,[vs_seg]
mov ah,49h
int 21h
; GVRAMクリア
mov ax,gvram0
mov es,ax
mov dx,0ff81h
mov al,0fh
out dx,al
xor ax,ax
mov cx,80*409/2
mov di,0
rep stosw
; 全画面消去
mov ah,02h
int 91h
mov al,0fh
mov dx,0fda0h
out dx,al
; crtc 戻す
mov al,0dh
mov bx,0040h
call crtc_data_set
mov al,0Eh
mov bx,0360h
call crtc_data_set
jmp short main_ret
main_init:
call trap_chk
je main_ret
; カーソル情報のdos 内部ワークを検索
call search
jnz main_ret
; 文字を完全に消す
call clear_scrn1
; パレット初期化
call palet_init
; 標準DOSコンソール停止
; VSYNC割り込み開始
call vs_set
; カーソル表示,システム行ありに設定
call set_scrn
; 環境変数領域開放
mov si,offset envseg
mov ax,cs:[si]
mov es,ax
mov ah,49h
int 21h
; 常駐終了
mov dx,offset start_init
add dx,15
shr dx,4
mov ax,3100h
int 21h
; プロセス終了
main_ret: mov ax,4c00h
int 21h
main endp
; 94/12/28 追加 start by boko.
clear_scrn1 proc near
; レイア1 側の画面を完全に消去する
; カーソル非表示
mov ax,0b01h
int 91h
; システム行の文字を保存
; Kvram選択
mov dx,0ff99h
xor al,al
out dx,al
push ds
mov ax,cvram
mov ds,ax
mov si,max_x * 2 * 24
mov di,offset mode_save_1
mov cx,max_x
rep movsw
mov si,max_x * 2 * 24 + 02000h
mov cx,max_x
rep movsw
pop ds
; 画面モード取得
mov ah,01ch
int 91h
; システム行なしに設定
;(oakモード表示域も消したい)
and al,10000111b
mov ah,01bh
int 91h
; 全画面消去
mov ah,02h
int 91h
; 300msec 待つ
mov cx,30000
int 0fdh
ret
clear_scrn1 endp
set_scrn proc
; カーソル表示
mov ax,0b00h
int 91h
; 画面モード取得
mov ah,01ch
int 91h
; システム行ありに設定
and al,11000111b
or al,01000000b
mov ah,01bh
int 91h
; 保存したシステム行を復帰
mov dx,0ff99h
xor al,al
out dx,al
push es
mov ax,cvram
mov es,ax
mov di,max_x * 2 * 24
mov si,offset mode_save_1
mov cx,max_x
rep movsw
mov si,max_x * 2 * 24 + 02000h
mov cx,max_x
rep movsw
pop es
; crtc 変更
mov al,0dh
mov bx,0036h
call crtc_data_set
mov al,0Eh
mov bx,0368h
call crtc_data_set
; 4プレーン全部表示
mov dx,0FF82h
mov al,001100111b
out dx,al
ret
set_scrn endp
search proc near
c_style_search:
; カーソル表示
; カーソル形状設定
; 低速ブリンク・拡張
call curs_style_070f
; 設定したパターン
; (07h,0fh)を
; io.sysの内部作業
; 領域から検索する。
; 検索するのは
; 0040:0000-0040:ffff
; の範囲
push es
mov ax,00040h
mov es,ax
mov di,0
mov cx,0ffffh
; dos ver.5.0/6.2の場合
dos5_loop:
mov ax,0070fh
call scan_word
jnz dos3
mov ax,di
mov cursor_s_ad,ax
dec ax
mov cursor_e_ad,ax
inc di
cmp byte ptr es:[di],0
jne dos5_loop
call check_style
jc dos5_loop
jmp short c_flag_search
dos3:
mov di,0
; スキャンするサイズ
mov cx,0ffffh
; dos ver. 3.1 の場合
; 格納順がdos 5とは異なる
dos3_loop:
mov ax,00f07h
call scan_word
jnz error
mov ax,di
mov cursor_e_ad,ax
dec ax
mov cursor_s_ad,ax
inc di
cmp byte ptr es:[di],0
jne dos3_loop
call check_style
jc dos3_loop
c_flag_search:
error:
exit:
pop es
ret
search endp
scan_word proc
; 検索サブルーチン
; in
; ax : 検索パターン
; out
; z : 発見
; di : 発見アドレス+1
; nz : 見つからない
scan_loop:
repnz scasb
jne not_found
cmp ah,es:[di]
jne scan_loop
not_found:
ret
scan_word endp
check_style proc
mov cursor_f_ad,di
dec ax
mov cursor_a_ad,ax
; 再びカーソルの
; 形を変更する
mov ax,00900h
mov dx,00e0fh
int 091h
; あたりをつけた
; アドレスの内容が
; 設定した値に変更
; されてる事を確認
mov bx,[cursor_s_ad]
cmp byte ptr es:[bx],0eh
jne curs_style_070f
mov bx,[cursor_e_ad]
cmp byte ptr es:[bx],0fh
jne curs_style_070f
; カーソル非表示
mov ax,00b01h
int 091h
; あたりをつけた
; アドレスの内容が
; 設定した値に変更
; されてる事を確認
mov bx,[cursor_f_ad]
cmp byte ptr es:[bx],01h
jne curs_style_070f
; カーソル行桁の
; 内部ワーク検索
mov ax,00406h
call scan_word
mov bx,di
dec bx
mov [cursor_p_ad],bx
; カーソル行桁変更
mov ah,00dh
mov dx,00101h
int 091h
; あたりをつけた
; アドレスの内容が
; 設定した値に変更
; されてる事を確認
cmp word ptr es:[bx],00101h
jne curs_style_070f
ret
curs_style_070f:
; カーソルを
; 検索対象の
; パターンにする
push bx
push cx
push di
mov ax,0095fh
mov dx,0070fh
; 無関係のレジスタは
; dos内部のスタック領域の
; 誤検索を防止するため
; ffffにする
mov bx,0ffffh
mov cx,bx
mov si,bx
mov di,bx
int 091h
; カーソル表示
mov ax,00b00h
int 091h
; カーソル位置設定
mov ah,00dh
mov dx,00406h
int 091h
pop di
pop cx
pop bx
; carry フラグセット
stc
ret
check_style endp
crtc_data_set proc
; in AL CRTC レジスタ番号
; BX そのレビジスタにセットする値
push ax
mov dx,CRTC_ADR_REG
out dx,al
mov dx,CRTC_DAT_REG
mov ax,bx
out dx,ax
pop ax
ret
crtc_data_set endp
mode_save_1 dw max_x dup (?)
mode_save_2 dw max_x dup (?)
code ends
end entry